// 导入请求接口
import { updateGoodsAPI, mergeLocalCartAPI, getCartListAPI } from '@/api/car'
import { message } from '@/components/Message'
// ----------------------------------------------------
const state = () => {
  return {
    // 购物车列表(对象数组)
    carList: []
  }
}
// -------------------------------------------------------------------
// 数据更新操作
const mutations = {
  // 添加购物车商品
  insertCart: (state, goodsObj) => {
    // 1.检测该商品是否已经加购过 -> skuId
    const item = state.carList.find(item => item.skuId === goodsObj.skuId)
    if (item) {
      // 如果加购过，改变商品数量
      item.count += goodsObj.count
    } else {
      // 否则将新加入的商品放在购物车头部
      state.carList.unshift(goodsObj)
    }
  },
  // 删除购物车
  delCart: (state, skuId) => {
    // 通过skuId删除对应商品,filter筛选出剩下的商品
    state.carList = state.carList.filter(item => item.skuId !== skuId)
  },
  // 更新购物车商品信息（现价，库存，商品是否有效的状态）
  updateCart: (state, { status, skuId }) => {
    // 基于skuId 去carList 查找对应的商品对象
    const item = state.carList.find(item => item.skuId === skuId)
    if (!item) return // 找不到提前返回
    // 把status最新的状态赋值给当前商品对象
    item.nowPrice = status.nowPrice
    item.stock = status.stock
    item.isEffective = status.isEffective
    // 这里不能展开赋值，...item 会破坏item的响应式
    // item = {
    //   ...item,
    //   ...status
    // }
  },
  // 更新指定商品数量
  updateCartCount: (state, { skuId, count }) => {
    const item = state.carList.find(item => item.skuId === skuId)
    if (!item) return
    item.count = count
  },
  // 更新指定商品的选中状态
  updateCartSelected: (state, { skuId, selected }) => {
    const item = state.carList.find(item => item.skuId === skuId)
    if (!item) return
    item.selected = selected
  },
  // 选中所有商品
  toggleAllCartList: (state, selected) => {
    // 1.先筛选出所有有效的购物车列表
    // 2.遍历，把selected的值赋值给每个对象的selected属性
    state
      .carList
      .filter(({ isEffective, stock }) => isEffective && stock > 0)
      // eslint-disable-next-line no-return-assign
      .forEach(item => item.selected = selected)
  },
  // 给购物车列表重新赋予新的列表
  setCartList: (state, newList) => {
    state.carList = newList
  }

}

// ----------------------------------------------------------------------------
// 异步操作
const actions = {
  // 发起加入购物车请求
  insertCartAction: ({ rootGetters, commit }, goodsObj) => {
    // ctx ：简化版的store对象，就等同于 从const store=useStore()
    // 包含以下属性和方法
    // commit():触发 mutation
    // dispatch():触发 action
    // state:当前模块自己的state
    // getters:当前模块自己的个getters
    // rootState:全局state,通过它可以访问其他模块下的state
    // rootGetters:全局getters
    // root:true  :如果action要访问其他vuex模块的mutation,
    // 除了传入方法名、参数需要加上第三个参数root:true，
    // 才能实现，不同vuex子模块之间mutation
    // 区分登录状态
    if (rootGetters.token) {
      // 已经登录
      // 1.发请求
      // 2.同步到后台
      // 3.同步到vuex

    } else {
      // 未登录
      //   提交加入购物车mutation
      commit('insertCart', goodsObj)
    }
  },
  // 异步删除购物车
  delCartAction: ({ rootGetters, commit }, skuId) => {
    if (rootGetters.token) {
      // 已经登录,需要发起入库请求
    } else {
      // 未登录,通知删除购物车的mutations
      commit('delCart', skuId)
    }
  },
  // 异步更新购物车商品信息（现价，库存，商品是否有效的状态）
  updateCartAction: async ({ state, rootGetters, commit }) => {
    if (rootGetters.token) {
      // 如果已经登录 ，进行数据库的操作
    } else {
      // 未登录
      // 遍历整个购物车列表
      // 使用for循环 因为里面没有函数可以让每个更新请求按顺序执行
      for (let i = 0; i < state.carList.length; i++) {
        const item = state.carList[i]
        // 依次发请求，更新每个商品状态
        const res = await updateGoodsAPI(item.skuId)
        console.log(res)
        // 拿到请求回来的最新商品数据，提交给更新商品的mutations
        commit('updateCart', {
          // 更新的状态
          status: res.result,
          // 更新指定的skuId的商品状态
          skuId: item.skuId
        })
      }
      // 更新完毕后提示
      message({ type: 'success', text: '更新购物车列表' })
    }
  },
  // 异步更新指定商品数量
  updateCartCountAction: ({ rootGetters, commit }, { skuId, count }) => {
    if (rootGetters.token) {
      // 已经登录,需要发起入库请求
    } else {
      // 未登录,通知更新指定商品数量的mutations
      commit('updateCartCount', { skuId, count })
    }
  },
  // 异步更新指定商品的选中状态
  updateCartSelectedAction: ({ rootGetters, commit }, { skuId, selected }) => {
    if (rootGetters.token) {
      // 已经登录,需要发起入库请求
    } else {
      // 未登录,通知更新指定商品的选中状态的mutations
      commit('updateCartSelected', { skuId, selected })
    }
  },
  // 异步切换是否选中所有商品
  toggleAllCartListAction: ({ rootGetters, commit }, selected) => {
    if (rootGetters.token) {
      // 已经登录,需要发起入库请求
    } else {
      // 未登录,通知更新指定商品的选中状态的mutations
      commit('toggleAllCartList', selected)
    }
  },
  // 合并后台和本地的购物车商品数据
  mergeLocalCartAction: async ({ state, dispatch }) => {
    // 1.基于state 对购物车列表做map映射，得到发起请求需要的参数
    const carList = state.carList.map(({ skuId, count, selected }) => {
      return {
        skuId, count, selected
      }
    })
    // 2.发起合并购物车请求(同步到数据库)
    await mergeLocalCartAPI(carList)
    // 3.获取合并后购物车列表
    dispatch('setCartListAction')
  },
  // 异步设置购物车列表
  setCartListAction: async ({ commit }) => {
    // 1.发请求，获取购物车列表
    const res = await getCartListAPI()
    // 2.提交mutation
    commit('setCartList', res.result)
  }

}
// -------------------------------------------------------------------------------
// 计算属性
const getters = {
  // 计算有效购物车列表 -> isEffective 为 true 并 stock>0
  effectiveCartList: (state) => {
    // 筛选出购物车列表中 isEffective为 true 并 stock>0（有库存） 的商品
    return state.carList.filter(({ isEffective, stock }) => isEffective && stock > 0)
  },
  // 计算出购物车中有效的商品总数量
  // effectiveCount: [{count:2,nowPrice:7},{count:2,nowPrice:7}]
  effectiveCount: (state, getters) => {
    // 使用 reduce
    return getters.effectiveCartList.reduce((sum, item) => {
      return sum + item.count
    }, 0)
  },
  // 计算出购物车中有效的商品总价格
  effectiveAmount: (state, getters) => {
    return getters.effectiveCartList.reduce((sum, { count, nowPrice }) => sum + count * nowPrice, 0)
  },
  // 计算出无效的购物车列表
  noneffectiveCartList: (state) => {
    return state.carList.filter(({ isEffective, stock }) => !(isEffective && stock > 0))
  },
  // 计算出有效的购物车列表中选中的商品
  allSelectedCartList: (state, getters) => {
    return getters.effectiveCartList.filter(({ selected }) => selected)
  },
  // 计算出有效的购物车列表中选中的商品总数
  allSelectedTotalCount: (state, getters) => {
    return getters.allSelectedCartList.reduce((sum, { count }) => sum + count, 0)
  },
  // 计算出有效的购物车列表中选中的商品总价
  allSelectedTotalAmount: (state, getters) => {
    return getters.allSelectedCartList.reduce((sum, { nowPrice, count }) => sum + nowPrice * count, 0)
  },
  // 判断有效的购物车列表中所有商品是否全选
  isAllSelected: (state, getters) => {
    return getters.effectiveCartList.every((item) => item.selected)
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions,
  getters
}
